package view{

	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.ByteArray;

	[SWF(width=400, height=300, backgroundColor=0x000000)]

	/**
	* Demonstrates how to visualize a playing sound file's data transformed
	* to a frequency spectrum as a vertical column chart of 512 values.
	*/
	public class SoundSpectrum extends Sprite {

		// the dimensions of the visualization
		private const WAVE_WIDTH:uint = 200;
		private const WAVE_HEIGHT:uint = 100;
		// the color of the columns
		private const WAVE_COLOR:uint = 0xFFFFFF;

		private var _soundController:SoundController;

		/**
		* Constructor. Loads the sound file using SoundController.
		*/
		public function SoundSpectrum() {
			_soundController = new SoundController("../../assets/IrishRock.mp3");
			_soundController.addEventListener(Event.CHANGE, onSoundChange);
		}

		/**
		* Updates the column chart sound visualization with the current sound data.
		*/
		private function updateGraph():void {
			// returns the sound data of the sound playing, transformed to a frequency spectrum
			var spectrumData:ByteArray = _soundController.getSoundSpectrum();
			graphics.clear();
			graphics.beginFill(WAVE_COLOR);
			var ratio:Number = WAVE_WIDTH/512;
			// how columns will be scaled horizontally to fit within the desired dimensions
			var x:Number = (stage.stageWidth-WAVE_WIDTH)/2;
			var y:Number = stage.stageHeight*4/5;
			var value:Number;
			var position:uint;
			var i:int = -1;
			while (++i < 512) {
				// the value is scaled vertically to fit within the desired dimensions
				value = Math.ceil(WAVE_HEIGHT*spectrumData.readFloat());
				// this results in columns being interspersed, with left and right channel data
				// at each frequency being next to each other, as opposed to having all left channel
				// data on one side and all right channel data on the other
				if (i < 256) {
					position = i*2;
				} else {
					position = (i%256)*2+1;
				}
				// draw the column in a negative direction so that is drawn "up" on the y axis
				graphics.drawRect(x+position*ratio, y, 1, -value);
			}
		}

		/**
		* Handler for when the sound changes (basically, an ENTER_FRAME while the sound is playing).
		* This calls updateGraph() to redraw column chart.
		*
		* @param event Event dispatched by SoundController.
		*/
		private function onSoundChange(event:Event):void {
			updateGraph();
		}

	}

}